/**
 * @author Roger Wu
 */

(function($) {
	var allSelectBox = [];
	var killAllBox = function(bid) {
		$.each(allSelectBox, function(i) {
			if (allSelectBox[i] != bid) {
				if (!$("#" + allSelectBox[i])[0]) {
					$("#op_" + allSelectBox[i]).remove();
					// allSelectBox.splice(i,1);
				} else {
					$("#op_" + allSelectBox[i]).css({
						height: "",
						width: ""
					}).hide();
				}
				$(document).unbind("click", killAllBox);
			}
		});
	};

	$.extend($.fn, {
		comboxSelect: function(options) {
			var op = $.extend({
				selector: ">a"
			}, options);

			return this.each(function() {
				var box = $(this);
				var selector = $(op.selector, box);

				allSelectBox.push(box.attr("id"));
				$(op.selector, box).click(function() {
					var options = $("#op_" + box.attr("id"));
					if (options.is(":hidden")) {
						if (options.height() > 300) {
							options.css({
								height: "300px",
								overflow: "scroll"
							});
						}
						var top = box.offset().top + box[0].offsetHeight - 50;
						if (top + options.height() > $(window).height() - 20) {
							top = $(window).height() - 20 - options.height();
						}
						options.css({
							top: top,
							left: box.offset().left
						}).show();
						killAllBox(box.attr("id"));
						$(document).click(killAllBox);
					} else {
						$(document).unbind("click", killAllBox);
						killAllBox();
					}
					return false;
				});
				$("#op_" + box.attr("id")).find(">li").comboxOption(
					selector, box);
			});
		},
		comboxOption: function(selector, box) {
			return this.each(function() {
				$(">a", this).click(function() {
					var $this = $(this);
					$this.parent().parent().find(".selected")
						.removeClass("selected");
					$this.addClass("selected");
					selector.text($this.text());

					var $input = $("select", box);
					if ($input.val() != $this.attr("value")) {
						$("select", box).val($this.attr("value"))
							.trigger("change");
					}
				});
			});
		},
		combox: function($parent) {
			var $p = $parent || $(document);
			/* 清理下拉层 */
			var _selectBox = [];
			$.each(allSelectBox, function(i) {
				if ($("#" + allSelectBox[i])[0]) {
					_selectBox.push(allSelectBox[i]);
				} else {
					$("#op_" + allSelectBox[i]).remove();
				}
			});
			allSelectBox = _selectBox;

			return this.each(function(i) {
				var $this = $(this).removeClass("combox");
				//下拉框的 名字
				var name = $this.attr("name");
				//下拉框的值
				var value =  $this.val();
				//被选中的option的文本
				var label = $("option[value=" + value + "]", $this).text();
				//当只改变的时候那个属性下拉框改变
				var ref = $this.attr("ref");
				//去后去获取的地址
				var refUrl = $this.attr("refUrl") || "";
				//当前下拉框的id 如果没有生成一个随机数
				var cid =  Math.round(Math.random() * 10000000);
                //删除原来已经存在的
				$("#op_combox_"+cid).remove();
				//生成下拉框的内容
				var select = '<div class="combox"><div id="combox_' + cid + '" class="select"' + (ref ? ' ref="' + ref + '"' : '') + '>';
				select += '<a href="javascript:" class="' + $this.attr("class") + '" name="' + name + '" value="' + value + '">' + label + '</a></div></div>';
				var options = '<ul class="comboxop" id="op_combox_' + cid + '">';
				//对每个optio 生成一个li
				$("option", $this).each(function() {
					var option = $(this);
					options += "<li><a class=\"" + (value === option[0].value ? "selected" : "") + "\" href=\"javascript:void(0)\" value=\"" + option[0].value + "\">" + option[0].text + "</a></li>";
				});
				options += "</ul>";
				$("body").append(options);
				$this.after(select);
				$("div.select", $this.next()).comboxSelect().append($this);
				//如果下拉框变动时配置了联动的节点和url地址
				if (ref && refUrl) {
					//当下拉框改变时执行的方法
					function _onchange(event) {
						//下拉框改变的值
						var value = $(this).attr("value");
						//联动的对象
						var $ref = $("#" + ref,$p);
						//联动的下拉框配置的初始值
						var initValue = $ref.attr("initValue");
						//如果不存在联动的下拉框则返回
						if ($ref.size() == 0)
							return false;
						//联动下拉框配置的第一个option
						var headTitle = $ref.attr("headTitle") ? $ref.attr("headTitle") : false;
						//如果配置了第一个option 但内容为空则给出默认的默认值
						if (headTitle !== false && StringUtils.isEmpty(headTitle)) {
							headTitle = "----请选择----";
						}
						//如果下拉框的值为空则不进行远程后台的请求
						if (StringUtils.isEmpty(value)) {
							var html = '';
							if (headTitle !== false) {
								html += "<option value='' >" + headTitle + "</option>";
							}
							var $refCombox = $ref.parents("div.combox:first");
							$ref.html(html).insertAfter($refCombox);
							$refCombox.remove();
							$ref.trigger("change").combox();
							return;
						}
						//进行远程后台请求
						$.ajax({
							type: 'POST',
							dataType: "json",
							url: refUrl.replace("{value}",encodeURIComponent($this.attr("value"))),
							cache: false,
							data: {},
							success: function(json) {
								//如果返回的数据为空
								if (!json)
									return;
								var html = '';
								//如果配置了第一个option
								if (headTitle !== false) {
									html += "<option value='' >" + headTitle + "</option>";
								}
								//对json数据执行遍历
								$.each(json, function(i, obj) {
									//json数据的格式是id name如果不是则报错
									//TODO 后期需要扩展自定的json属性
									var id = obj.id;
									var value = obj.name;
									if (!id || !value) {
										$.error("数据格式不正确");
									}
									html += '<option value="' + id + '"  ' + (id == initValue ? "selected = 'selected'" : "") + '">' + value + '</option>';
								});
								var $refCombox = $ref.parents("div.combox:first");
								$ref.html(html).insertAfter($refCombox);
								$refCombox.remove();
								$ref.trigger("change").combox();
							},
							error: DWZ.ajaxError
						});
					}

					$this.unbind("change", _onchange).bind("change", _onchange);
					//如果下拉框的内容不为空则触发change事件使联动下拉框得到相应的值
					if (StringUtils.isNotEmpty(value)) {
						$this.trigger("change");
					}
				}

			});
		},
		initCombox: function($p) {
			this.each(function() {
				//默认访问json的属性
				var jsonKey = "id";
				var jsonValue = "name";
                //获取用户自定义的要访问json的属性
                if(StringUtils.isNotEmpty($(this).attr("dataFormat"))) {

                	 var  dataFormat = DWZ.jsonEval($(this).attr("dataFormat"));
                     jsonKey = dataFormat.key ? dataFormat.key:jsonKey;
                     jsonValue = dataFormat.value ? dataFormat.value:jsonValue;
                }
               
				//初始化url地址
				var initUrl = $(this).attr("initUrl");
				//初始化的值
				var initValue = StringUtils.isNotEmpty($(this).attr("initValue")) ? $(this).attr("initValue") : false;
				//判断是否定义了第一个option
				var headTitle = $(this).attr("headTitle") ? $(this).attr("headTitle") : false;
				if (headTitle !== false && StringUtils.isEmpty(headTitle)) {
					headTitle = "----请选择----";
				}
				//如果初始化url不为空
				if (StringUtils.isNotEmpty(initUrl)) {
					var $self = $(this);
					$.ajax({
						type: 'POST',
						dataType: "json",
						url: initUrl,
						cache: false,
						data: {},
						success: function(json) {
							//如果返回数据为空则直接返回
							if (!json) {
								return;
							}
							var html = '';
							//配置了第一个option则执行添加option
							if (headTitle !== false) {
								html += "<option value='' >" + headTitle + "</option>";
							}
							//如果返回的是一个数组,创建一个数组
							if (!$.isArray(json)) {
								json = [json];
							}
							$.each(json, function(i, obj) {
								var id = obj[jsonKey];
								var value = obj[jsonValue];
								if (!id || !value) {
									$.error("数据格式不正确");
								}
								html += '<option value="' + id + '"  ' + (id === initValue ? "selected = 'selected'" : "") + '">' + value + '</option>';
							});
							$self.html(html);
							$self.combox($p);
						}
					});
				} else {//如果初始化url为空
					var html = "";
					var dataMap = $(this).attr("dataMap");
					if (headTitle !== false) {
						html += "<option value='' >" + headTitle + "</option>";
					}
					if (StringUtils.isNotEmpty(dataMap)) {
						var json = DWZ.jsonEval(dataMap);
						for (var attr in json) {
							html += "<option value='"+attr+"' >" + json[attr] + "</option>";
						}
					}
					$(this).prepend(html);
					var value = StringUtils.isNotEmpty($(this).attr("initValue")) ? $(this).attr("initValue") : "";
					$("option",$(this)).each(function(){
						if($(this).val() === value) {
							$(this).attr("selected","true");
						}
					});
					$(this).combox($p);
				}
			});
		}
	});
})(jQuery);